SELECT TOP(n) FROM _TableName_ ORDER BY _ColumnName_是一种非标准SQL语句,从数据表中最多检索出排在前面的n条数据来,但是它可以用SELECT TOP(n) PERCENT FROM _TABLENAME_ ORDER BY 这样的根据总数据量来按比例取得数据记录。
如果数据表中有560条数据,检索SELECT TOP(1) FROM _TableName_ ORDER BY _ColumnName_就会检索出6条数据来,总而言之,不是按四舍五入计的,而是按ceil向上取整法计数的。
如果不加ORDER BY,数据会以不确定的顺序检索出来。
这里括号可有可无,但是建议加括号。
n可以是常数,也可以是定义的变量。下面这种写法也是可以的:

SQLDECLARE @n AS BIGINT = 5;
SELECT TOP (@n) orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;
GO

如果加了WITH TIE,比如说写成

SQLSELECT TOP (3) WITH TIES orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC;

orderdate相同的数据会被计作一条数据,总检索出的结果可能不止3条。

OFFSET FETCH语句是标准SQL语句。但是它有局限性,不能按百分比检索出数据结果。

SQLSELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC, orderid DESC
OFFSET 50 ROWS FETCH NEXT 25 ROWS ONLY;

表示跳过前50条数据,取得第51到第75条数据。

SQLSELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC, orderid DESC
OFFSET 0 ROWS FETCH FIRST 25 ROWS ONLY;

表示取得第1到第25条数据。

SQLSELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC, orderid DESC
OFFSET 50 ROWS;

表示跳过前50条数据,取得之后的全部数据。
OFFSET FETCH语句必须带有ORDER BY语句,但是如果不想指定用于排序的columnName,可以用下面这种这种语法,即用SELECT NULL作为排序列:

SQLSELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY (SELECT NULL)
OFFSET 0 ROWS FETCH FIRST 3 ROWS ONLY;

OFFSET FETCH可用于分页检索,比如说下面这种写法:

SQLDECLARE @pagesize AS BIGINT = 25, @pagenum AS BIGINT = 3;

SELECT orderid, orderdate, custid, empid
FROM Sales.Orders
ORDER BY orderdate DESC, orderid DESC
OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY;

樊潇洁
415 声望23 粉丝

笨鸟先飞